// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-class-definitions-static-semantics-early-errors
description: The identifier `arguments` is not restricted within method forms
info: |
  ClassStaticBlockBody : ClassStaticBlockStatementList

  - It is a Syntax Error if ContainsArguments of ClassStaticBlockStatementList
    is true.
includes: [compareArray.js]
features: [class-static-block]
---*/

function Test() {
    var instance;
    var method, methodParam;
    var getter;
    var setter, setterParam;
    var genMethod, genMethodParam;
    var asyncMethod, asyncMethodParam;

    class C {
      static {
        instance = new class {
          method({test262 = methodParam = arguments}) {
            method = arguments;
          }
          get accessor() {
            getter = arguments;
          }
          set accessor({test262 = setterParam = arguments}) {
            setter = arguments;
          }
          *gen({test262 = genMethodParam = arguments}) {
            genMethod = arguments;
          }
          async async({test262 = asyncMethodParam = arguments}) {
            asyncMethod = arguments;
          }
        }();
      }
    }

    instance.method('method');
    instance.accessor;
    instance.accessor = 'setter';
    instance.gen('generator method').next();
    instance.async('async method');

    assert.compareArray(['method'], method, 'body');
    assert.compareArray(['method'], methodParam, 'parameter');
    assert.compareArray([], getter, 'body');
    assert.compareArray(['setter'], setter, 'body');
    assert.compareArray(['setter'], setterParam, 'parameter');
    assert.compareArray(['generator method'], genMethod, 'body');
    assert.compareArray(['generator method'], genMethodParam, 'parameter');
    assert.compareArray(['async method'], asyncMethod, 'body');
    assert.compareArray(['async method'], asyncMethodParam, 'parameter');
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_TEST; i++) {
    Test();
}
